package ejemplosVideo;

import processing.core.PApplet;
import processing.video.*;

/**
 * Frame Differencing 
 * by Golan Levin. 
 * 
 * Quantify the amount of movement in the video frame using frame-differencing.
 */ 

public class FrameDifferencing extends PApplet  {

	private static final long serialVersionUID = 1L;

	int numPixels;
	int[] previousFrame;
	Capture video;

	public void setup() {
		size(640, 480); // Change size to 320 x 240 if too slow at 640 x 480
		// Uses the default video input, see the reference if this causes an error
		video = new Capture(this, width, height, 24);
		numPixels = video.width * video.height;
		// Create an array to store the previously captured frame
		previousFrame = new int[numPixels];
		loadPixels();
	}

	public void draw() {
		if (video.available()) {
			// When using video to manipulate the screen, use video.available() and
			// video.read() inside the draw() method so that it's safe to draw to the screen
			video.read(); // Read the new frame from the camera
			video.loadPixels(); // Make its pixels[] array available

			int movementSum = 0; // Amount of movement in the frame
			for (int i = 0; i < numPixels; i++) { // For each pixel in the video frame...
				 int currColor = video.pixels[i];
				 int prevColor = previousFrame[i];
				// Extract the red, green, and blue components from current pixel
				int currR = (currColor >> 16) & 0xFF; // Like red(), but faster
				int currG = (currColor >> 8) & 0xFF;
				int currB = currColor & 0xFF;
				// Extract red, green, and blue components from previous pixel
				int prevR = (prevColor >> 16) & 0xFF;
				int prevG = (prevColor >> 8) & 0xFF;
				int prevB = prevColor & 0xFF;
				// Compute the difference of the red, green, and blue values
				int diffR = abs(currR - prevR);
				int diffG = abs(currG - prevG);
				int diffB = abs(currB - prevB);
				// Add these differences to the running tally
				movementSum += diffR + diffG + diffB;
				// Render the difference image to the screen
				pixels[i] = color(diffR, diffG, diffB);
				// The following line is much faster, but more confusing to read
				//pixels[i] = 0xff000000 | (diffR << 16) | (diffG << 8) | diffB;
				// Save the current color into the 'previous' buffer
				previousFrame[i] = currColor;
			}
			// To prevent flicker from frames that are all black (no movement),
			// only update the screen if the image has changed.
			if (movementSum > 0) {
				updatePixels();
				println(movementSum); // Print the total amount of movement to the console
			}
		}
	}
}
